Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Backend для JsHttpRequest на Си (Юрий Насретдинов, оценка: 4)
Author Message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sat Feb 03, 2007 3:30 am (написано за 1 час 7 минут 28 секунд)
   Post subject: Backend для JsHttpRequest на Си
Reply with quote

Да, Вы не очитались :), действительно backend для библиотеки JsHttpRequest на языке Си.

У меня возникла идея сделать такой backend, поскольку иногда требуются значительные вычисления со стороны backend'а, или же просто требуется моментальный ответ на запросы.

Приведу пример использования:
Code (c): скопировать код в буфер обмена
/* файл backend.c */

#include <stdio.h>
#include <time.h>
#include <string.h>

#include "JsHttpRequest.h"

int main(int argc, char* argv[])
{
        /* задаём кодировку, как и в PHP-версии */
        if(!JsHttpRequest("utf-8")) return 1;
       
        /* инициализация генератора случайных чисел.
           Должен же пример хоть что-то делать! */

        srand(time(NULL));
       
        /* поскольку динамическое создание массивов на Си несколько затруднено,
           для добавления результата запроса используются функции
           _RESULT   (key, value) - добавляет строчку (аналогично $_RESULT[key]=value)
           _RESULT_i (key, value) - добавляет число

           функция _REQUEST("somevar") - полный аналог записи $_REQUEST["somevar"] в PHP.
           Единственное отличие - это то, что _REQUEST("somevar"); всегда возвращает (char*)
        */


        _RESULT   ("q", _REQUEST("q"));
        _RESULT_i ("md5", rand());

        if(_REQUEST("q")==NULL || strcmp(_REQUEST("q"), "error") == 0)
        {
                printf (www.opengroup.org/onlinepubs/009695399/functions/printf.html)("An error occured");
                return 1;
        }

        return 0;
}
Интерфейс библиотеки, к сожалению, немного отличается от PHP-варианта из-за специфики языка Си - создание динамических массивов требует ручного выделения памяти и т.д, поэтому были добавлены пара функций, которые несколько облегчают участь программиста и берут на себя всю работу с памятью, максимально приближая работу с Си-вариантом к PHP.

Что не поддерживается:
    сессии PHP и cookies
    загрузчик form (фактически, загрузка файлов)! Лучше всего использовать функцию JsHttpRequest.cquery, чтобы гарантированно избежать ошибок
Рекомендации по использованию:
Во frontend лучше всего использовать функцию JsHttpRequest.cquery(), которая полностью аналогична JsHttpRequest.query() за исключением того, что не даёт библиотеке послать запрос с помощью загрузчика form. JsHttpRequest.js, в который встроена функция JsHttpRequest.cquery() прилагается.

Не используйте эту библиотеку в простых CGI-скриптах, потому что Вы можете намного удобнее использовать её в PHP-варианте, в котором нет тех ограничений, которые есть в Си-версии.

Ручная компиляция под Linux и FreeBSD:
Предполагается, что под Linux у Вас уже стоит пакет с поддержкой iconv. Если такого пакета не стоит, попробуйте поставить пакет iconv-dev, iconv-devel, iconv-src, iconv, libiconv или другие пакеты, содержащие ключевое слово iconv, в зависимости от дистрибутива. Если сервер под Linux не Ваш, вскоре будут предоставлены уже скомпилированные файлы, необходимые в этом случае для работы.

В FreeBSD должен стоять порт libiconv. Если его не стоит (и сервер не Ваш), то смотрите раздел «Решение проблем с iconv»

В идеальном случае компиляция библиотеки и backend'а будет выглядеть так:
Code (Bash): скопировать код в буфер обмена
gcc -c JsHttpRequest.c
gcc -c backend.c

gcc -o backend.cgi backend.o JsHttpRequest.o
Если возникают ошибки вроде «iconv.h: No such file or directory» или «JsHttpRequest.o: undefined reference to `libiconv'», смотрите раздел «Решение проблем с iconv».

После того, как Вы скомпилировали свой backend.cgi, обычно его следует переместить в папку сgi-bin, чтобы он заработал.

Ручная компиляция под Windows с использованием MinGW:
Для успешной компиляции Вам понадобится MinGW и Msys (www.mingw.org/download.shtml), там будет вполне достаточно скачать MinGW-version.exe и MSYS-version.exe, а потом поставить их.

Зайдите в папку с исходниками Вашей программы и распакуйте туда содержимое windows-iconv-files.rar (там содержится уже скомпилированная мной библиотека libiconv. Вы можете, если хотите, скомпилировать её сами :) ) . Запустив MSYS и настроив его, согласно README, поправьте JsHttpRequest.c, заменив там строчку «#include <iconv.h>» на «#include "iconv.h"» скомпилируйте свой backend с помощью следующих команд:
Code (Bash): скопировать код в буфер обмена
gcc -c JsHttpRequest.c
gcc -c backend.c

gcc -o backend.cgi backend.o JsHttpRequest.o libiconv-2.dll
Как нетрудно заметить, процедура компиляции под Windows с использованием MSYS практически не отличается от таковой под *nix. Учтите, что Вы теоретически можете использовать Visual Studio для компиляции backend, но с подключением библиотеки libiconv Вам придётся разбираться самим.

Заметьте, что обычно требуется помещать backend.cgi и libiconv-2.dll в папку cgi-bin (Вы можете посмотреть, как работает backend для Windows под Денвером, если скомпилируете всё так, как тут написано).

Если Вы скомпилировали libiconv сами (./configure && mingw32-make && mingw32-make install), можете скомпилировать backend немного иначе. Для этого Вам не придётся трогать JsHttpRequest.c, но команды для компиляции будут немного другими:
Code (Bash): скопировать код в буфер обмена
gcc -c JsHttpRequest.c -I"/usr/local/include"
gcc -c backend.c

gcc -o backend.cgi JsHttpRequest.o backend.o -L"/usr/local/lib" -liconv
Кстати, очень похоже на вариант под FreeBSD

Решение проблем с iconv
Если сервер работает под Linux, то часто может помочь установка пакета iconv-dev или похожего. Вы также можете установить библиотеку libiconv.

Если сервер работает под FreeBSD, нужен установленный порт libiconv. При ручной компиляции, если gcc не сможет сам найти библиотеку, можно попробовать скомпилировать backend следующим образом (если не поможет, скопируйте libiconv.a и iconv.h для FreeBSD (во вложении) в папку с исходниками):
Code (Bash): скопировать код в буфер обмена
gcc -c JsHttpRequest.c -I"/usr/local/include" -I"."
gcc -c backend.c

gcc -o backend.cgi backend.o JsHttpRequest.o -L"/usr/local/lib/" -L"." -liconv
Пример работы C-backend'а
Операционная система на сервере - FreeBSD: nasretdinov.ru/test.html


JsHttpRequest-c.tar.gz
 Description:
Архив с исходными текстами библиотеки. Также там есть тестовый backend и test.html для проверки

Download
 Filename:  JsHttpRequest-c.tar.gz
 Filesize:  10.78 KB
 Downloaded:  1082 Time(s)


windows-iconv-files.rar
 Description:
В этом архиве находится скомпилированная версия libiconv под Windows и соответствующий заголовочный файл.

Download
 Filename:  windows-iconv-files.rar
 Filesize:  593.68 KB
 Downloaded:  1045 Time(s)


freebsd-iconv-files.tar.gz
 Description:
libconv.a и iconv.h для FreeBSD. Я не могу обещать, что без установленного пакета libiconv будет что-то работать

Download
 Filename:  freebsd-iconv-files.tar.gz
 Filesize:  701.46 KB
 Downloaded:  1111 Time(s)



Last edited by Юрий Насретдинов on Sat Mar 03, 2007 2:09 am; edited 10 times in total
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sat Feb 03, 2007 3:37 am (спустя 7 минут; написано за 4 минуты 11 секунд)
   Post subject:
Reply with quote

Я написал в форум "Прочее", потому что библиотека ещё может дорабатываться (в частности, если кому-то удастся заставить работать перехват вывода, я буду очень благодарен, если вы выложите результат сюда). Я не планирую добавлять поддержку сессий PHP, загрузки файлов и поддержки windows, ИМХО для этого прекрасно подходит PHP-вариант.

P.S. Чуть не забыл, в библиотеке нельзя посылать ответ в виде многомерного массива. Зато можно принимать ответ в виде массива, для этого нужно указывать имена вроде _REQUEST("array[key][another_key]");
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Feb 06, 2007 10:13 pm (спустя 3 дня 18 часов 35 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Я добавил перехват вывода, и немного изменил интерфейс, чтобы максимально приблизить его к PHP-backend'у. В частности, сохранены названия переменных и самого класса JsHttpRequest. Несмотря на то, что в библиотеке ещё есть ошибки, её вполне можно использовать.
Back to top
View user's profile Send private message Send e-mail
Kupuyc
Участник форума



Joined: 31 Mar 2006
Posts: 146
Карма: 5
   поощрить/наказать


PostPosted: Wed Feb 07, 2007 5:55 am (спустя 7 часов 42 минуты; написано за 23 секунды)
   Post subject:
Reply with quote

Очень интересно. +1. Буду наблюдать по мере сил.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sat Feb 24, 2007 3:16 am (спустя 16 дней 21 час 20 минут; написано за 2 минуты 41 секунду)
   Post subject:
Reply with quote

Как бы это странно ни звучало, добавлена поддержка Windows. Планируется в некоторой перспективе добавить возможность для backend'а работать в составе модуля Apache (как раз-таки для моментальной реакции на запросы с использованием минимума ресурсов).
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Mar 14, 2007 3:25 am (спустя 18 дней 8 минут; написано за 6 минут 48 секунд)
   Post subject:
Reply with quote

Теперь backend намного реже будет выдавать 500 ошибку и «падать» - есть шанс, что вы вообще с ней не встретитесь, когда будете писать своё приложение :). Вывод перехватывается теперь на очень ранней стадии; при любой, даже фатальной, ошибке (например попытка записи в read-only участок) вывод оборачивается в корректный код на JavaScript. Если это вообще возможно, frontend получит ответ от backend'а в том или ином виде.

Если произошла серьёзная ошибка, в выводе backend будет написано следующее:
Code (any language): скопировать код в буфер обмена
// WARNING: It seems that a serious error occured.
// Please see errors section or error log for details

// BEGIN JsHttpRequest
...
// END JsHttpRequest
То есть выделено комментариями, что что-то не так. Ну и в отладочный текст будет записано максимум информации. Также добавлена экспериментальная поддержка загрузчика form (multipart/form-data). Не особо рассчитывайте на его работу, всё равно, скажем, файлы он закачивать не умеет.

Данный релиз экспериментальный, хотя и добавлено много нового (теперь в архиве предоставляется Makefile, и вполне есть вероятность того, что ваш backend соберётся просто командой make). Если кому интересно - смотрите вложение.


JsHttpRequest-c.snapshot.rar
 Description:
Экспериментальная версия. В ней очень серьёзно улучшена стабильность работы, большее внимание уделено стандартам программирования на Си, и т.д.

Download
 Filename:  JsHttpRequest-c.snapshot.rar
 Filesize:  11.25 KB
 Downloaded:  868 Time(s)

Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sun Apr 08, 2007 12:21 pm (спустя 25 дней 8 часов 56 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Олень»,
расположенную в форуме Лень сходить в Поиск или почитать документацию (08 Апреля 2007, 13:21).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed May 30, 2007 1:44 am (спустя 1 месяц 21 день 13 часов 22 минуты)
   Post subject:
Reply with quote


М

Перенесено из форума: Прочее.
Перенесено в форум: JsHttpRequest :: JavaScript.
Back to top
View user's profile Send private message Send e-mail
snark
Участник форума



Joined: 20 Mar 2005
Posts: 27
Карма: 0
   поощрить/наказать


PostPosted: Thu Jun 14, 2007 8:58 pm (спустя 15 дней 19 часов 13 минут; написано за 1 час 8 минут 8 секунд)
   Post subject: Re: Backend для JsHttpRequest на Си
Reply with quote

Юpий Насрeтдинов wrote:
Да, Вы не очитались :), действительно backend для библиотеки JsHttpRequest на языке Си.
+100 Вам! спасибо, буду следить за развитем...
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Fri Apr 25, 2008 5:55 pm (спустя 10 месяцев 10 дней 20 часов 57 минут; написано за 9 минут 18 секунд)
   Post subject:
Reply with quote

Гхм, если бы сообщения на форуме могли запылиться, с этой ветки нужно было бы очень долго стряхивать пыль... И тем не менее, проект не совсем мертв. Я давно говорил об интеграции JsHttpRequest с каким-нибудь небольшим веб-сервером, чтобы была ощутимая выгода от backend'а JsHttpRequest на Си.

В архиве лежит переделанная мной версия веб-сервера cheetah под свои нужды, причем единственное, что он может -- работать в качестве JsHttpRequest-backend-сервера.

Я немного модифицировал automake и autoconf-скрипты так, что для компиляции cheetah и его запуска нужно лишь ввести ./configure && make && ./cheetah -b "~" . По адресу localhost:8000/ будет демонстрация работы JsHttpRequest.

В архиве модифицированная версия JsHttpRequest.c, позволяющая запускать backend не только как CGI, а также сам backend, совмещенный с самим веб-сервером -- cheetah.c . Версия не претендует на промышленное использование, скорее просто демонстрация того, что для интеграции библиотеки JsHttpRequest.c в веб-сервер много усилий прикладывать не придется.

P.S. Подобный веб-сервер может быть очень полезен например для работы чатов, где издержки PHP могут быть весьма ощутимы.


cheetah+jshr.zip
 Description:
Веб-сервер cheetah, переделанный для работы в качестве AJAX-сервера.

Download
 Filename:  cheetah+jshr.zip
 Filesize:  96.31 KB
 Downloaded:  869 Time(s)

Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML